/*
 * funciones.c
 *
 *  Created on: Oct 3, 2013
 *      Author: enano
 */

#include "funciones.h"

#define CSTR_LONG 100
#define FECHA_LONG 25
#define COMENT_LONG 10
#define CSTR_FIN 1
#define EXT_TAV_LONG 4
#define EXT_REV_LONG 2
#define EXT_CUR_LONG 8
#define EXTENSION_TAV ".tav"
#define EXTENSION_CURRENT ".current"

/*  TODO dejar acá solamente las funciones necesarias para el MAIN, y el gettime.  */


int parsearArgumentos (const char* argumento)
{   argum arg;

    if ( strcmp( argumento, ADD ) == EQUAL )
        arg = add;
    else if ( strcmp( argumento, REMOVE) == EQUAL )
            arg = rm;
        else if ( strcmp( argumento, QUERY) == EQUAL )
                arg = query;
            else if ( strcmp( argumento, COMMIT) == EQUAL )
                    arg = commit;
                else if ( strcmp( argumento, ROLLBACK) == EQUAL )
                        arg = rollb;
                  else
                        arg = invalid;

    return arg;
}

int gettime (char* strFechaHora, int longStr)
{
    time_t fechaHora;
    struct tm* tm_info;

    time(&fechaHora);
    tm_info = localtime(&fechaHora);

    strftime(strFechaHora, longStr, "%Y-%m-%d %H:%M", tm_info);
    fprintf(stderr, "%s\n", strFechaHora);

    return OK;
}


int agregarCoincidenciasEnDupla(TCola* duplas, FILE* arch1, FILE* arch2)
{   tDupla coinciden;

    char lineaArch1[CSTR_LONG], lineaArch2[CSTR_LONG];
    int renglonArch1 = MINIMO, renglonArch2 = MINIMO;

    fscanf(arch1, "%s[\n]", lineaArch1);
    for ( renglonArch1 = MINIMO; NOT feof(arch1); renglonArch1++)
    {

        fscanf(arch2, "%s[\n]", lineaArch2);
        for ( renglonArch2 = MINIMO; NOT feof(arch2); renglonArch2++)
        {
            if ( strcmp(lineaArch1, lineaArch2) == EQUAL )
            {
                coinciden[ARCH_UNO] = renglonArch1;
                coinciden[ARCH_DOS] = renglonArch2;
                C_Agregar(duplas, &coinciden);
                /* k = renglonArch2; */
            }

            fscanf(arch2, "%s[\n]", lineaArch2);
        }
        rewind(arch2);
/*        for (h=0; h < k+1; h++)
            fscanf(arch2, "%s", lineaArch2);
*/
        fscanf(arch1, "%s[\n]", lineaArch1);
    }

    return OK;
}


int cargarColaCambios(TCola *duplas, TCola *cambios)
{   int i = MINIMO, j = MINIMO, lineaLong;
    char linea[CSTR_LONG] = {'\0'};
    tDupla coinciden;
    cambio_t cambio;

    while ( NOT C_Vacia(*duplas) )
    {
        C_Sacar(duplas, coinciden);

        for(; j < coinciden[ARCH_UNO]; j++ )
        {
/*           fscanf(archActualVersion, "%s[\n]", linea);  */
           cambio.pos = j;
           lineaLong = strlen(linea)+CSTR_FIN;
           cambio.texto = (char*) malloc( lineaLong * sizeof(char) );
           strncpy( cambio.texto, linea, lineaLong );
           cambio.tipo = TAV_INSE;
           C_Agregar(cambios, &cambio);
        }

        for (; i < coinciden[ARCH_DOS]; i++ )
        {
/*            fscanf(archProxVersion, "%s[\n]", linea);  */
            cambio.pos = i;
            lineaLong = strlen(linea)+CSTR_FIN;
            cambio.texto = (char*) malloc( lineaLong * sizeof(char) );
            strncpy( cambio.texto, linea, lineaLong );
            cambio.tipo = TAV_ELIM;
            C_Agregar(cambios, &cambio);
        }
    }

    return OK;

}

int insertarCambioUltimo (TListaSimple *lista, revision_t *dato)
{
    while ( L_Mover_Cte(lista, L_Siguiente) == TRUE )
    {
        /* Recorre la lista sin hacer nada, asegurandose
         * de quedar en la última posisicón por si se
         * modificó el corriente previamente.
         * */
    }

    L_Insertar_Cte(lista, L_Siguiente, dato);

    return OK;
}


/*
 *  Abrir Current y Ruta, armarDuplas, cargarCambios, debería estar en otra función quizá.
 *  LA PUTA QUE ME PARIO..
 */


int guardarNuevaVersion(TAV *tav)
{


    return OK;
}




/* -------------------------------------------------------------------------------------------------- */
/*     DE ACÁ PARA ABJO NO SE USA MÁS NADA!     */

int registrarModificaciones (TCola* duplas, const char* archivo1, const char* archivo2)
{   FILE *arch1, *arch2, *arch3;
    char linea[CSTR_LONG] = {'\0'}, archivo3[20] = "cambios.1";
    char fechaHora[FECHA_LONG], comentario[10] = "coment.";
    int i = 1, j = 1;
    tDupla coinciden;

    arch1 = fopen(archivo1, "r+");
    if ( arch1 == NULL ) return ERR_ABRIR_ARCHIVO;

    arch2 = fopen(archivo2, "r+");
    if ( arch2 == NULL ) return ERR_ABRIR_ARCHIVO;

    arch3 = fopen(archivo3, "w+");
    if ( arch3 == NULL ) return ERR_ABRIR_ARCHIVO;

    gettime(fechaHora, FECHA_LONG);
    fprintf(arch3, "%s\n", fechaHora);
    fprintf(arch3, "Comentario: %s\n\n", comentario);

    while ( NOT C_Vacia(*duplas) )
    {
        C_Sacar(duplas, coinciden);

        while( j < coinciden[ARCH_UNO] )
        {
           fscanf(arch1, "%s[\n]", linea);
           fprintf(arch3, "I@%d %s", j, linea);
           j++;
        }

        while ( i < coinciden[ARCH_DOS] )
        {
            fscanf(arch2, "%s[\n]", linea);
            fprintf(arch3, "E@%d %s", i, linea);
            i++;
        }

        fprintf(arch3, "\n");


    }

    fclose(arch1);
    fclose(arch2);
    fclose(arch3);

    return OK;
}


int mostrarDuplas (TCola* dupla)
{   tDupla coinciden;

    while ( C_Vacia(*dupla) == FALSE )
    {
        C_Sacar(dupla, &coinciden);
        printf("Renglon: %d,%d\n", coinciden[0], coinciden[1]);
    }
    C_Vaciar(dupla);

    return OK;

}


int coincidenciasEntreArch (TCola* duplas, const char* archivo1, const char* archivo2)
{   FILE *arch1, *arch2;

    arch1 = fopen(archivo1, "r+");
    if ( arch1 == NULL ) return ERR_ABRIR_ARCHIVO;

    arch2 = fopen(archivo2, "r+");
    if ( arch2 == NULL ) return ERR_ABRIR_ARCHIVO;

    agregarCoincidenciasEnDupla(duplas, arch1, arch2);

    fclose(arch1);
    fclose(arch2);


    return OK;
}

